<?php
//基础模块
/**
 * 获取请求地址
 * @return false|mixed|string
 */
function getPath()
{
    $a = "/";
    if (isset($_SERVER['QUERY_STRING'])) {
        $a = $_SERVER['QUERY_STRING'];
    }
    $b = stripos($a, "&");
    if ($b != "") {
        $c = substr($a, 0, $b);
    } else {
        $c = $a;
    }
    if ($c == "") {
        $c = "/";
    }
    if (substr($c, strlen($c) - 1, 1) == "/") {
        $c = substr($c, 0, strlen($c) - 1);
    }
    if ($c == "") {
        $c = "/";
    }
    if (substr($c, 0, 1) != "/") {
        header("Location:./?/");
    }
    return $c;
}
/**
 * 处理引用内容
 * @param string $input 源内容
 * @return string|string[] 处理后的内容
 */
function linkProcess(string $input){
    $index=0;
    $args_index=0;
    $args_list=[];
    $left=false;
    $special_list=[];
    while(true){
        $t=substr($input,$index++,1);
        if ($t=="{"){
            $left=true;
            continue;
        }
        if ($t=="}"){
            $left=false;
            $args_index++;
        }
        if ($left){
            if ($t==" "||$t=="\r"||$t=="\n"){
                $left=false;
                continue;
            }
            @$args_list[$args_index].=$t;
        }
        if ($index==strlen($input)){
            break;
        }
    }
    foreach ($args_list as $item) {
        if (strpos($item,"_")){
            $l=explode("_",$item);
            switch (strtoupper($l[0])){
                case "IMG"://{IMG_NAME_EXT}
                    $input=str_replace("{".$item."}",FILES_PATH.strtolower($l[1]).".".strtolower($l[2]),$input);
                    break;
                case "JS"://{JS_NAME}
                    $input=str_replace("{".$item."}","src/js/".$l[1].".js",$input);
                    break;
                case "LINK"://{LINK_address}
                    $link = substr($item,strpos($item,"_")+1);
                    if (ENABLE_STATIC == "1"){
                        $input = str_replace("{" . $item . "}", "/" . $link, $input);
                    }else {
                        $input = str_replace("{" . $item . "}", "./?/" . $link, $input);
                    }
                    break;
            }
        }else{
            if (isset($special_list[$item])){
//                consoleLog($item);
//                consoleLog($special_list[$item]);
                $input=str_replace("{".$item."}",$special_list[$item],$input);
            }
        }
//        consoleLog($item."\n");
    }
//    print_r($args_list);
    return $input;
}
/**
 * 加载错误页面
 * @param string $title 错误页面标题
 * @param string $message 错误消息
 * @param bool $die 是否终止程序执行
 */
function loadErrorPage(string $title, string $message,bool $die = true)
{
    echo "<head><title>$title</title><meta name='viewport' content='width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no' /><meta charset='UTF-8'></head>".str_replace("{ERROR_CONTENT}",$message,str_replace("{ERROR_TITLE}",$title,file_get_contents(HTML_PATH."error.html")));
    if ($die){die();}
}
/**
 * 加载HTML页面
 * @param string $name 页面文件名
 * @param array $args 加载页面时的参数
 */
function loadHtml(string $name,array $args=[]){
	if(!file_exists(HTML_PATH.$name.".html")){loadErrorPage("加载失败","${name}.html文件不存在");die();}
    $a = str_replace("\r","\n",file_get_contents(HTML_PATH.$name.".html"));
    $fl = str_replace("-->","",str_replace("<!--","",explode("\n",$a)[0]));//读取首行配置
    $a=str_replace("{setColor}",file_get_contents(HTML_PATH."SetColor.html"),$a);
    $t=[];
    foreach (explode(";", $fl) as $item) {
        if ($item) {
            $e = explode("=", $item);
            $t[$e[0]] = @$e[1];
        }
    }
    $h=file_get_contents(HTML_PATH."head.html");
    $r=str_replace("{TITLE}",$t["title"],$h);
    $fe="";
    $bfe="";
    $after="";
    foreach (explode(",", $t["js"]) as $item) {
        if ($item) {
            if ($item==$name){
                $after.="<script>".file_get_contents(JS_PATH.$name.".js")."</script>";
            }else {
                if (ENABLE_STATIC==1) {
                    $bfe .= "<script src='/src/js/$item.js'></script>";
                }else{
                    $bfe .= "<script src='src/js/$item.js'></script>";
                }
            }
        }
    }
    foreach (explode(",", $t["css"]) as $item) {
        if ($item) {
            if ($item==$name){
                $after.="<style>".file_get_contents(CSS_PATH.$name.".css")."</style>";
            }else {
                if (ENABLE_STATIC==1) {
                    $fe .= "<link rel='stylesheet' href='/src/css/$item.css'>";
                }else{
                    $fe .= "<link rel='stylesheet' href='src/css/$item.css'>";
                }
            }
        }
    }
    $r=str_replace("{FILES}",$fe,$r);
    if ($t["mobile"]=="yes"){$r.='<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />';}
    for ($i=0;$i<count($args);$i++){
        $key = array_keys($args)[$i];
        $value = $args[$key];
        $a=str_replace("{".$key."}",$value,$a);
    }
    $a=str_replace("{SetColor}",file_get_contents(HTML_PATH."SetColor.html"),$a);
    $a=str_replace("{JS}",$bfe,$a);
    $version = file_get_contents(FILES_PATH . "version");
    $phpversion = phpversion();
    $a=str_replace("{FOOTER}","<div class='footer'><p>Developed by SCH</p><p>Tools $version <br>Running with PHP $phpversion</p></div>",$a);
    echo linkProcess($r);
    echo str_replace("<!--".$fl."-->","",linkProcess($a));
    echo linkProcess($after);
//    print_r($t);

}
/**
 * 向控制台发送消息
 * @param string $content 发送的消息
 */
function consoleLog(string $content){
    fwrite(fopen('php://stdout','a'),$content);
}

//字符串加密解密模块
/**
 * 加密字符串
 * @param string $string 需要加密的数据
 * @param string $secret 加密用的密钥
 * @param bool $return 是否返回，默认不返回直接输出
 * @return string 返回加密后的数据
 */
function string_encode(string $string,string $secret,bool $return=false):string{
    return __a::_a($string,$secret,$return);
}
/**
 * 解密字符串
 * @param string $string 需要解密的数据
 * @param string $secret 解密用的密钥
 * @param bool $return 是否返回，默认不返回直接输出
 * @return string 返回解密后的数据
 */
function string_decode(string $string,string $secret,bool $return=false):string{
    return __a::_b($string,$secret,$return);
}

//参数处理模块，根据不同请求方法获取参数
/**
 * 返回GET请求url中的参数
 * @param string $name 参数名
 * @return string 返回指定参数的内容，参数未提供时返回null
 */
function args_get(string $name):string{
    return __b::_a($name);
}
/**
 * 返回POST请求头中的参数
 * @param string $name 参数名
 * @return string 返回指定参数的内容，参数未提供时返回null
 */
function args_post(string $name):string{
    return __b::_b($name);
}
/**
 * 返回GET/POST请求的参数
 * @param string $name 参数名
 * @return string 返回指定参数的内容，参数未提供时返回null
 */
function args_request(string $name):string{
    return __b::_c($name);
}

// 拓展模块
/**
 * 判断是否为移动端
 * @return bool 返回TRUE表示移动端，FALSE表示PC端
 */
function isMobile():bool {
    if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
        return true;
    }
    if (isset($_SERVER['HTTP_VIA'])) {
        return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
    }
    if (isset($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = array('nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile','MicroMessenger');
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            return true;
        }
    }
    if (isset ($_SERVER['HTTP_ACCEPT'])) {
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return true;
        }
    }
    return false;
}

/**
 * 发送邮件
 * @param string $address 邮箱地址
 * @param string $name 发件人名称
 * @param string $title 邮件标题
 * @param string $message 邮件内容
 * @return array|string[] 返回状态
 */
function sendMail(string $address,string $name,string $title,string $message):array{
    $config=readConfig("mail");
    require "src/core/mail/PHPMailerAutoload.php";
    $mail=new PHPMailer(true);
    try{
        $mail->CharSet="UTF-8";
        $mail->SMTPDebug=0;
        $mail->isSMTP();
        $mail->Host=$config["host"];
        $mail->SMTPAuth=true;
        $mail->Username=$config["username"];
        $mail->Password=$config["password"];
        $mail->SMTPSecure='ssl';
        $mail->Port=$config["port"];
        $mail->setFrom($config["username"],$name);
        $mail->addAddress($address);
        $mail->isHTML(true);
        $mail->Subject=$title;
        $mail->Body="<div style='font-family: arial,serif;text-align:center;position:absolute;top:0;left:0;right:0;bottom:0'><div style='width:50%;display: inline-block;vertical-align: middle;border-bottom: 7px solid #176391; position: relative;text-align: left;padding-bottom: 100px;box-shadow: 0 0 10px 0 #ccc;'><div style='font-size: 18px;color:#aaa;font-weight: 100;padding-left: 10px;padding-right: 10px'>$message</div><div style='position:absolute;bottom: -20px;right:0;left:33%;height:7px;background-color: #56b9e8;box-shadow: 0 0 10px 0 #ccc;'></div></div><div style='height:100%;display: inline-block;vertical-align: middle;box-shadow: 0 0 10px 0 #ccc;'></div></div>";
        if ($mail->send()){
            return ["status"=>"success"];
        }else{
            return ["status"=>"fail","reason"=>$mail->ErrorInfo];
        }
    }catch (Exception $e){
        return ["status"=>"fail","reason"=>$mail->ErrorInfo];
    }
}

// Cookie处理模块，将一些数据存储至浏览器中
/**
 * 写入cookie数据到浏览器
 * @param string $name 数据名
 * @param string $value 数据内容
 */
function cookie_set(string $name,string $value){
    __c::_a($name,$value);
}
/**
 * 从浏览器中读取cookie数据
 * @param string $name 数据名
 * @return string 返回cookie中的数据，若该数据不存在则返回null
 */
function cookie_get(string $name):string{
    return __c::_b($name);
}
/**
 * 从浏览器中删除某个cookie数据
 * @param string $name 数据名
 */
function cookie_delete(string $name){
    __c::_c($name);
}
//配置文件处理模块，快速读取配置文件
/**
 * 读取配置文件，文件格式为 *_config.json
 * @param string $name 配置文件名，不需要加 _config.json
 * @return array 返回配置文件数据
 */
function readConfig(string $name):array{
    return __d::__a($name);
}